package plp.orientadaObjetos2.memoria;

import java.util.List;

import plp.expressions2.expression.Id;
import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException;
import plp.orientadaObjetos1.memoria.AmbienteCompilacaoOO1;
import plp.orientadaObjetos2.declaracao.funcao.DecFuncao;
import plp.orientadaObjetos2.util.MapPacoteArquivo;
import plp.orientadaObjetos2.util.SuperClasseMap;

public interface AmbienteCompilacaoOO2 extends AmbienteCompilacaoOO1{
	
	/**
	 * Mapeia um identificador de classe com o identificador da super-classe.
	 * @param classe identificador da sub-classe
	 * @param superClasse identificador da super-classe
	 * @throws ClasseNaoDeclaradaException Quando a super-classe nao foi declarada
	 */
	public void mapSuperClasse(Id classe, Id superClasse) throws ClasseNaoDeclaradaException;	

	/**
	 * Dado um identificador da classe, recupera a super-classe
	 * @param classe identificador da classe base
	 * @return Definicao da super classe
	 * @throws ClasseNaoDeclaradaException Quando a classe ainda nao foi definida
	 */
	public SuperClasseMap getSuperClasse(Id classe) throws ClasseNaoDeclaradaException;

	/**
	 * Mapeia o nome (identificador) de uma funcao a sua definicao.
	 * @param nomeFuncao nome da funcao que sera mapeada
	 * @param funcao definicao da funcao que sera mapeada
	 * @throws FuncaoJaDeclaradaException caso um mapeamento para <code>nomeFuncao</code> ja exista
	 */
	public void mapFuncao(Id nomeFuncao, DecFuncao funcao) throws FuncaoJaDeclaradaException;
	
	/**
	 * Verifica se um arquivo já foi avaliado 
	 * @param mapeamento
	 * @return
	 */
	public boolean arquivoJaAvaliado(MapPacoteArquivo mapeamento) ;
	
	public void adicionarArquivo(MapPacoteArquivo mapeamento);
	
	public List<MapPacoteArquivo> getListaArquivoAvaliado();
}
